<?php

/**
 * 涌浪模板标签基类
 * @author tony
 */
abstract class YlTaglib {

    /**
     * 初始化方法
     */
    protected function __construct() {
        
    }

    /**
     * 匹配标签的内容和属性字符串
     * @param string $content 待匹配的字符串
     * @param string $tag 标签名
     * @return array 匹配的内容
     * <code>
     *  array(
     *      0 => array(
     *          0 => '匹配的标签的全部内容',
     *          1 => '匹配的属性字符串',
     *          2 => '匹配的标签包含的文本'
     *      ),
     *      ......
     *  )
     * </code>
     */
    private function _parseTagInfos($content, $tag) {
        $regex = '/<' . $tag . '\s(.*?)>(.*?)<\/' . $tag . '>/is';
        preg_match_all($regex, $content, $matched, PREG_SET_ORDER);
    }

    /**
     * 分析XML属性
     * @access private
     * @param string $attrs  XML属性字符串
     * @return array
     */
    private function _parseXmlAttrs($attrs) {
        $xml = '<tpl><tag ' . $attrs . ' /></tpl>';
        $xml = simplexml_load_string($xml);
        if (!$xml)
            throw_exception(L('_XML_TAG_ERROR_'));
        $xml = (array) ($xml->tag->attributes());
        $array = array_change_key_case($xml['@attributes']);
        return $array;
    }

    /**
     * 解析标签属性(包括给定默认值)
     * @param string $attrText 标签属性文本
     * @return array 标签属性数组
     */
    private function _parseAttributes($attrText) {
        $attributes = $this->_parseXmlAttrs($attrText);
        foreach($this->_attributes as $attr => $default){
            if(!isset($attributes[$attr]) || empty($attributes[$attr])){
                //赋予默认值
                if(!empty($default)){
                    $attributes[$attr] = $default;
                }
            }
        }
        return $attributes;
    }

    /**
     * 解析模板标签
     */
    abstract function parse();
}
